home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 1191 / 1191.xpi / chrome / reminderfox.jar / content / reminderfox / mail / mail.js < prev    next >
Text File  |  2009-11-17  |  63KB  |  1,782 lines

  1. /**    
  2.  * mail.js
  3. <br> 
  4. <br>  @since 
  5.        2008-08-04  Open Msg with msgID also with FX (non-mail apps)
  6. <br>   2008-04-14    tagging    - add/delete 'ical-*' tags for messages containing 
  7.  *                                     iCal data
  8. <br>   2008-01-19    add TB-priority handling
  9. <br>   2006-11-11    mod for TB1.5/label and TB2.0/tag
  10. <p> 
  11. <br>  @see 
  12. <br>     MessageID-Finder for Mozilla 'messageidfinder-2.0.0.xpi' by markushossner_AT_gmx_DOT_de and 
  13. <br>     'reminderfox-0.9.6.xpi' by Daniel Lee, Tom Mutdosch
  14.  */
  15.  
  16. var rmFx_currentSummary = null;
  17. var rmFx_ReferenceID = "@" + "reminderfox" 
  18. var rmFx_FCC ="";
  19. var rmFx_cmdID = null;
  20. var rmFx_cmdString = "";
  21.  
  22. /**
  23.  *  Work with rmFx_cmdLineHandler to support starting 'messenger' (TB/SM/PB) 
  24.  *  with start option:
  25.  *  
  26. <br>    @call  'messenger'.exe -reminderFox {remoteID}            -msgString {details for op}
  27. <br>
  28. <br>    @call  'messenger'.exe -reminderFox UID:refID             -msgString {file path}
  29. <br>    @call  'messenger'.exe -reminderFox COMPOSE:subject       -msgString {compose parameters}
  30. <br>    @call  'messenger'.exe -reminderFox msgID:finalMessageId  -msgString {subject info}
  31.  */ 
  32. function rmFx_startupwMsgId() {
  33. //------------------------------------------------------------------------------
  34.     var startMsg    = window.arguments[0].split("|.|");
  35.     rmFx_cmdID         = startMsg[0];
  36.     rmFx_cmdString    = startMsg[1];
  37.  
  38.     //gWTEST Darwin    ---------<<< ---------------
  39.     
  40.     var logString = (" startupwMsgId 'remote start': "
  41.             + "\n rmFx_cmdID: " + rmFx_cmdID
  42.             + "\n rmFx_cmdString: " + rmFx_cmdString);
  43.     
  44.     var rmFx_consoleService = Components.classes["@mozilla.org/consoleservice;1"]
  45.          .getService(Components.interfaces.nsIConsoleService);
  46.  
  47.     rmFx_consoleService.logStringMessage("reminderFox: " + logString);
  48.     // ------------>>> ----------------
  49.         
  50.         
  51.     var cDate = new Date();
  52.     var msgLog = " ** Remote access **  " + rmFx_cmdID + " at: " + cDate;
  53.     try {
  54.         rmFxUtil.dump2Console(msgLog);
  55.         rmFxMsg.whichMessenger();
  56.     } catch (ex) {
  57.         var loader = Components.classes["@mozilla.org/moz/jssubscript-loader;1"]
  58.                                         .getService(Components.interfaces.mozIJSSubScriptLoader);
  59.         loader.loadSubScript("chrome://reminderfox/content/utils/rmFxUtils.js");
  60.         rmFxUtil.dump2Console(msgLog);
  61.         rmFxMsg.whichMessenger();
  62.     }
  63.     // -reminderFox UID:refID -msgString mailFile.path
  64.     if (rmFx_cmdID.indexOf('UID:') > -1) {        
  65.         document.title = "Remote send message";    // reminderFox_getBundle().getString("rf.mail.remote.sendmsg");
  66.  
  67.         document.getElementById('rmFx_msg1').setAttribute("value", rmFx_cmdID);  
  68.         document.getElementById('rmFx_msg2').setAttribute("value", "");
  69.         setTimeout( rmFxMsg.sendwUIDgo, 1000 );
  70.                
  71.     // -reminderFox COMPOSE:subject -msgString {compose parameters}
  72.     } else  if (rmFx_cmdID.indexOf('COMPOSE:') > -1) {        
  73.         document.title = "Remote compose message";  // reminderFox_getBundle().getString("rf.mail.remote.composemsg"); 
  74.  
  75.         var msgString = unescape(rmFx_cmdString).split(";\n;");
  76.         var subject   = msgString[0].substring(8);
  77.  
  78.         document.getElementById('rmFx_msg1').setAttribute("value", "Subject: " + subject);
  79.         document.getElementById('rmFx_msg2').setAttribute("value", "");
  80.         setTimeout( rmFxMsg.composeMSGgo, 1000 );
  81.            
  82.     // -reminderFox msgID:finalMessageId -msgString {subject info}
  83.     } else  if (rmFx_cmdID.indexOf('msgID:') > -1) {
  84.         document.title = "Remote open message";    //    reminderFox_getBundle().getString("rf.mail.remote.openmsg");
  85.  
  86.         document.getElementById('rmFx_msg1').setAttribute("value", unescape(rmFx_cmdString));
  87.         document.getElementById('rmFx_msg2').setAttribute("value", rmFx_cmdID);
  88.         setTimeout( rmFx_retryMsgIdDelayed, 1000 );
  89.  
  90.     } else {
  91.         alert ("reminderFox call error!")
  92.         return;
  93.     }
  94. }
  95. /**
  96.  *  find message with MsgID ////////////////////////////
  97.  *
  98.  */
  99.  
  100. function rmFx_retryMsgIdDelayed() {
  101.     //'UID:'
  102.     //var reminderID = rmFx_cmdID.substring(4);
  103.     //'msgID:'
  104.     
  105.     var msgHdr = reminderFox_MessageIdFinder(rmFx_cmdID.substring(6));
  106.     if (msgHdr) {
  107.         window.close();
  108.     }   
  109.     else  {  // 'reminderFox_MessageIdFinder' with TB startup will fail because
  110.              //  folder structure not build already
  111.              //  if it fails  -->>  dislog for 'retry'
  112.         document.getElementById('msgIDnotFound').setAttribute("hidden", "false");
  113.         document.getElementById('retryMsgId').setAttribute("disabled", "false");  
  114.         sizeToContent();
  115.         window.focus();
  116.     }                
  117. }
  118.  
  119. function rmFx_retryMsgId() {
  120.  
  121.     if (rmFx_cmdID.indexOf('UID:') > -1) {
  122.        rmFxMsg.sendwUIDgo();
  123.         window.close();
  124.     } else {
  125.         var msgHdr = reminderFox_MessageIdFinder(rmFx_cmdID);
  126.         if (msgHdr) {
  127.             window.close();
  128.         }
  129.     }    
  130. }
  131.  
  132. function reminderFox_changeMessageLabel(addTag) {
  133.     reminderFox_OpenMessageByMessageID(gDBView.hdrForFirstSelectedMessage.messageId /*messageId*/
  134.             ,false /*msgOpen*/, addTag, true /*opTag*/)
  135. }
  136.  
  137. function rmFxMsgHdrDate (dateStr) { 
  138.     // PRTime is in microseconds, Javascript time is in milliseconds
  139.     // so divide by 1000 when converting
  140.     
  141.     var time = new Date();
  142.     time.setTime(dateStr / 1000);
  143.    
  144.     var timeString = reminderFox_mail_getTimeString( time );
  145.     var dateVariableString;
  146.     try {
  147.       dateVariableString = reminderFox_getUnicodePref(REMINDER_FOX_PREF + "." + REMINDER_FOX_LIST_DATE_LABEL);
  148.         } catch(e) {
  149.     }   
  150.     var remFoxDate =reminderFox_getDateVariable( null, time, dateVariableString ) + "  " + timeString;
  151.     return remFoxDate;
  152. }
  153.  
  154.  
  155.     /**
  156.      * GetSelectedMessages for different TB/SM/PB versions
  157.      * 
  158.      */
  159.     function rmFx_GetSelectedMessages() {
  160.         rmFxMsg.whichMessenger();
  161.         
  162.         if ((gRmFx_Messenger == "TB3") || (gRmFx_Messenger == "SM2")) {
  163.             var mailWindow = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService()
  164.                 .QueryInterface(Components.interfaces.nsIWindowMediator)
  165.                 .getMostRecentWindow("mail:3pane");
  166.             if (mailWindow) {
  167.                 return mailWindow.gFolderDisplay.selectedMessageUris;
  168.             }
  169.         } else {    // valid for all other versions
  170.             return GetSelectedMessages();
  171.         }
  172.     }
  173.  
  174. /**
  175. <br> *  Add email reminder for current selected message
  176.  *
  177.  */
  178. function reminderFox_thunderBirdAddEmailReminder() {
  179.  
  180.     try {
  181.         document.getElementById('threadPaneContext').hidePopup();
  182.     } catch (e) {}
  183.     try {
  184.     document.getElementById('messagePaneContext').hidePopup();
  185.     } catch (e) {}
  186.  
  187.     // with TB3 this is not supported !!
  188.     // var msgSelected = GetSelectedMessages();
  189.     var msgSelected = rmFx_GetSelectedMessages();
  190.     
  191.     // ("works for all selected messages");    
  192.     if (msgSelected.length > 1) {
  193.         window.GetThreadTree().view.selection.clearSelection();    
  194.     }
  195.     
  196.     for (var nHdr = 0; nHdr < msgSelected.length; nHdr++) {
  197.     
  198.         var i = msgSelected[nHdr].indexOf("#");
  199.         var nextHeader = msgSelected[nHdr].substring(i +1);
  200.         
  201.         var msgDBView = {};
  202.         msgDBView = window.gDBView;
  203.         msgDBView.selectMsgByKey(nextHeader);
  204.         
  205.         var msgHdr = gDBView.hdrForFirstSelectedMessage;
  206.      
  207.         // subject
  208.         var remFoxSummary = msgHdr.mime2DecodedSubject;
  209.         // from
  210.         var remFoxFrom =  msgHdr.mime2DecodedAuthor;        
  211.         // recipients
  212.         var remFoxTo = msgHdr.mime2DecodedRecipients;        
  213.     
  214.         var remFoxPrio =msgHdr.priority;
  215.         
  216.         //  add text from hightlighted mail-text
  217.         var remFoxDetails = null;
  218.         var focusedWindow = document.commandDispatcher.focusedWindow;
  219.         var selectedText = focusedWindow.getSelection();
  220.         
  221.         if (selectedText != null && selectedText != "") {
  222.              remFoxDetails = "\n\n" +    reminderFox_getBundle().getString("rf.add.mail.message.details") + 
  223.                   ":\n" +     selectedText.toString();        
  224.         }
  225.  
  226.         // messageID
  227.         var messageId =  msgHdr.messageId;
  228.         // strip out quotes as the extractHeader method returns some message-id's with extraneous quotes
  229.         // like: "000c01c6941b$6ddb3c30$7be040"@foo.com
  230.         messageId = messageId.replace(new RegExp(/\"/g),"");
  231.         var remFoxMessageID = "<" + messageId + ">";
  232.        
  233.         // date 
  234.         var remFoxDate = rmFxMsgHdrDate (msgHdr.date);
  235.         
  236.         var newDate = new Date();
  237.         newDate.setDate( newDate.getDate() + 1 );  // default to using tomorrow's date for reminder
  238.     
  239.         var reminderId =reminderFox_generateUniqueReminderId( newDate );
  240.         var mailIdentifierString = reminderFox_getBundle().getString("rf.add.mail.message.mail.identifier");
  241.         var    newReminderToBeAdded = new ReminderFoxEvent( reminderId, newDate, mailIdentifierString + " " + remFoxSummary );
  242.         newReminderToBeAdded.messageID = remFoxMessageID;
  243.     
  244.         // add default message header info to the Notes section
  245.         newReminderToBeAdded.notes = 
  246.             reminderFox_getBundle().getString("rf.add.mail.message.sender")        + ": " + remFoxFrom   +  "\n" + 
  247.             reminderFox_getBundle().getString("rf.add.mail.message.recipients")    + ": " + remFoxTo     +  "\n" + 
  248.             reminderFox_getBundle().getString("rf.add.mail.message.date")            + ": " + remFoxDate   +  "\n" + 
  249.             reminderFox_getBundle().getString("rf.add.mail.message.subject")        + ": " + remFoxSummary; 
  250.         
  251.         if ( remFoxDetails != null ) { 
  252.             newReminderToBeAdded.notes = newReminderToBeAdded.notes + remFoxDetails;
  253.         }
  254.     
  255.     // PRIORITY definition for  RmFx and  TB
  256.     // const REMINDER_PRIORITY_NORMAL = null;  // default
  257.     // const REMINDER_PRIORITY_IMPORTANT = 1;
  258.     //    TB header.priority:  6= very high;  5=high;  1=normal;  3=low;  2=very low
  259.     
  260.         if ( msgHdr.priority >= 5 ) {             // for TB 'very high' and 'high'
  261.             newReminderToBeAdded.priority = 1;    // set RmFx 'Important'
  262.         }
  263.             
  264.         var added = reminderFox_addReminderHeadlessly( newReminderToBeAdded );        
  265.         if (added) {
  266.             rmFx_msgTAGing("Reminderfox", true, "#993399");
  267.         } else {
  268.             // only if more remaining reminders!!
  269.             if ((msgSelected.length - nHdr - 1) > 0) {
  270.                 // if the last msg was deleted, ask to terminate all remaining or continue
  271.                 var title =    reminderFox_getBundle().getString("rf.add.addreminder.title");
  272.                 var msg =    reminderFox_getBundle().getString("rf.add.addreminder.instruction2")
  273.                             +    "\n\n" + reminderFox_getBundle().getString("rf.add.addreminder.instruction3") + " ┬╗ "
  274.                             + (msgSelected.length - nHdr - 1) 
  275.                              + " ┬½ " +  reminderFox_getBundle().getString("rf.add.addreminder.instruction4");
  276.                 var key0 =    reminderFox_getBundle().getString("rf.button.ok");
  277.                 var key1 =    "No, terminate."; // reminderFox_getBundle().getString("rf.add.addreminder.cancel"); 
  278.                     
  279.                 if (rmFxUtil.ConfirmEx(title, msg, key0, key1) == 1 ) {  // cancel pressed
  280.                      nHdr = msgSelected.length +1; 
  281.                 }
  282.             }
  283.         }            
  284.     }
  285. }
  286. /** 
  287.  * displayMail 
  288.  *
  289. <br>  retrieve and display this reminder's associated email in Thunderbird
  290.  */
  291.  
  292. function reminderFox_displayMailbyMsgID(recentReminder) {
  293.         reminderFox_openByMessageID(recentReminder);
  294. }
  295.  
  296.  
  297. function reminderFox_doShowMail() {
  298.     var currentReminder = getReminderForSelectedItem( );
  299.     if ( currentReminder.messageID != null ) {
  300.         reminderFox_openByMessageID(currentReminder);
  301.     }
  302. }
  303.  
  304. function reminderFox_doShowMailTodo() {
  305.     var currentTodo = getTodoForSelectedItem( );
  306.     if ( currentTodo.messageID != null ) {    
  307.         reminderFox_openByMessageID(currentTodo);    
  308.     }
  309. }
  310.  
  311. function reminderFox_doShowMailShortcut() { 
  312.     if ( isReminderTabSelected() ) {
  313.         reminderFox_doShowMail();
  314.     }
  315.     else {
  316.         reminderFox_doShowMailTodo();
  317.     }
  318. }
  319.  
  320. function reminderFox_openByMessageID(currentReminder){
  321.     var finalMessageId = reminderFox_finalMessageId(currentReminder.messageID);
  322.  
  323.     rmFx_currentSummary = currentReminder.summary;
  324.  
  325.     // if using Firefox, this starts (Thunderbird) Messenger App ... 
  326.     // using a specific 'commandLine' Handler 
  327.     
  328.     if(!("@mozilla.org/messenger;1" in Components.classes)) {
  329.  
  330.         var mailApp = rmFx_MessengerApp();
  331.         if ((mailApp == null) || (mailApp == ""))  {
  332.             rmFxUtil.PromptAlert("Messenger not found!");  // reminderFox_getBundle().getString("rf.schedule. $$$string "));
  333.             return;
  334.         }
  335.     
  336.         var args = new Array();   
  337.         args [0] = "-reminderFox";
  338.         args [1] = "msgID:" + finalMessageId;    
  339.         args [2] = "-msgString"; 
  340.         args [3] = escape(rmFx_currentSummary);                 // currentReminder.summary;
  341.         
  342.         try {
  343.             go4Process.init(mailApp);
  344.         } catch (ex) {}
  345.         go4Process.run(false, args, args.length);
  346.     
  347.         return;        // FX schedules TB with msgID:messageID -msgString rmFx_currentSummary
  348.     }   
  349.  
  350.     if (finalMessageId !="" ) {
  351.         var msgHdr = reminderFox_MessageIdFinder(finalMessageId);
  352.  
  353.         if (!msgHdr) {
  354.             var strMsgIdNotFound = reminderFox_getBundle().getString("rf.add.mail.messageIdNotFound.message") +
  355.                     "\n" + rmFx_currentSummary  + 
  356.                     "\n(Message-ID: " + finalMessageId +")";
  357.             rmFxUtil.PromptAlert(strMsgIdNotFound);
  358.             window.setCursor("auto");
  359.         }
  360.     }
  361. }
  362.  
  363. function reminderFox_finalMessageId(messageId){
  364.      var midleft = (messageId.toLowerCase()).search("<"); 
  365.      var finalMessageId;
  366.      if (midleft == -1)
  367.           finalMessageId = "";
  368.     else {
  369.         var midRight = (messageId.substring(midleft)).search(">");
  370.        finalMessageId =  messageId.substring(midleft + 1, midRight );
  371.     }
  372.     return finalMessageId;
  373. }
  374.  
  375.  
  376.    /**
  377.     * Clear the 'Reminder' tag from a message
  378.     * 
  379.     * @note    
  380.     *     this function only works in messenger/ThunderBird 
  381.     * 
  382.     * @param messageId
  383.     */
  384. function reminderFox_clearLabelByMessageID(messageId){
  385.  
  386. /* ----------        
  387.     if (!rmFx_isMessenger())  {
  388.         var  shell = Components.classes["@mozilla.org/browser/shell-service;1"]
  389.             .getService(Components.interfaces.nsIShellService);
  390.  
  391.         if (shell)
  392.             shell.openApplication(Components.interfaces.nsIShellService.APPLICATION_MAIL);
  393.         return;
  394.     }   
  395. --------- */
  396.         
  397.      var midleft = (messageId.toLowerCase()).search("<"); 
  398.      var finalMessageId;
  399.      if (midleft == -1)
  400.           finalMessageId = "";
  401.     else {
  402.         var midRight = (messageId.substring(midleft)).search(">");
  403.        finalMessageId =  messageId.substring(midleft + 1, midRight );
  404.       }
  405.  
  406.     if (finalMessageId !="" )  reminderFox_OpenMessageByMessageID( finalMessageId, 
  407.             false /*msgOpen*/, 0 /*labelTag*/, false /*opTag*/);
  408. }
  409.  
  410.  
  411.  
  412. /**
  413.  * MessageID features
  414.  * based on: MessageID-Finder for Mozilla by
  415.  * 
  416.  * Markus Hossner - markushossner@gmx.de
  417.  */
  418.  
  419. const reminderFox_pmpB = 0;        //Boolean
  420. const reminderFox_pmpN = 1;        //Integer
  421. const reminderFox_pmpS = 2;        //Char
  422.  
  423. var reminderFox_prefRead = false;
  424. var reminderFox_accountURIs = new Array();
  425. var reminderFox_msgWindow;
  426.  
  427.  
  428. function reminderFox_MessageIdFinder(strmessageid) {
  429.     
  430.     strmessageid = reminderFox_ExtractMessageID(strmessageid);
  431.  
  432.     var msgHdr = reminderFox_OpenMessageByMessageID(strmessageid,true);
  433.     return msgHdr;        
  434. }
  435.  
  436.  
  437. function reminderFox_getMsgWindow() {
  438.     if ( reminderFox_msgWindow == null ) {
  439.         reminderFox_msgWindow = Components.classes["@mozilla.org/messenger/msgwindow;1"].
  440.                 createInstance(Components.interfaces.nsIMsgWindow);
  441.     }
  442.     return reminderFox_msgWindow;
  443. }
  444.  
  445.  
  446. function reminderFox_ExtractMessageID(strmessageid) {
  447.     var midParts = strmessageid.replace(/^<|>$/g, "")
  448.                                .split(":");
  449.  
  450.     switch (midParts.length) {
  451.         case 1:
  452.             strmessageid = strmessageid;
  453.             break;
  454.  
  455.         case 2:
  456.             if (midParts[0] == "news" || midParts[0] == "nntp") {
  457.                 strmessageid = midParts[1].replace(/^\/\/.*?\// ,"");
  458.             } else if (midParts[0] == "mailto") {
  459.                 strmessageid = midParts[1];
  460.             }
  461.             break;
  462.  
  463.         case 3:
  464.             strmessageid = midParts[2].replace(/^.+?\// ,"");
  465.             break;
  466.  
  467.         default:
  468.             strmessageid = "";
  469.             break;
  470.     }
  471.     return strmessageid;
  472. }
  473.  
  474.  
  475.     /**
  476.      * Message with matching 'messageid' will be processed with tag 'labelTag'
  477.      * based on option 'msgOpen'.
  478.      * If 'msgOpen' true the message will be opened.
  479.      *
  480. <p>  *  Message is labeled/tagged with optional parameter 'labelTag' 
  481. <ul> *      TB1.5
  482. <br> *           labelTag = 0 noLabel   =1 ... =5  see Label Options with Pull-Down Menue
  483. <br> *           opTag = not used
  484. </ul>*
  485. <ul> *      TB2.x / TB3.x / SM2 / PB
  486. <br> *         labelTag = string eg:ReminderFox
  487. <br> *         opTag = true: add Tag;  false: remove Tag
  488. </ul>*
  489.     *  @since 2009-04 :  
  490.     *    messages in Template and Draft folders are not opened, but
  491.     *    the folder is selected
  492.     *
  493.     *  @since 2009-07
  494.     *    Postbox support .. needs special handling for open folder/message
  495.     *
  496.     * @note
  497.     *    TB3/SM2 and PB need to select message row in folder
  498.     *
  499.     *   @param messageId
  500.     *   @param msgOpen - true: opens in new window
  501.     *   @param labelTag - 
  502.     *   @param opTag - true: adds, false: deletes the tag
  503.     */
  504. function reminderFox_OpenMessageByMessageID(messageId, msgOpen, labelTag, opTag) {
  505.     
  506.     rmFxMsg.whichMessenger();
  507.     reminderFox_AddNewsServers();   
  508.     window.setCursor("wait");
  509.  
  510.     var msgHdr = reminderFox_SearchMessageLocally(messageId);
  511.     
  512.     window.setCursor("auto");
  513.     
  514.     if (msgHdr) {
  515.         var folder = msgHdr.folder;    
  516.         var folderUri = folder.URI;
  517.         var messageUri = folder.getUriForMsg(msgHdr);  
  518.               
  519.            //    rmFx_MsgOpenNewWindowForFolder    (folderUri, messageId);
  520.  
  521.         var windowManager = Components.classes['@mozilla.org/appshell/window-mediator;1']
  522.                                                .getService(Components.interfaces.nsIWindowMediator);
  523.         var winId = windowManager.getMostRecentWindow("mail:3pane");
  524.         
  525.         
  526.         if (gRmFx_Messenger == "TB3") {     //TB3.0b3 ... Shredder/3.0b3pre
  527.             winId.focus();
  528.             winId.document.getElementById('tabmail').openTab("folder", 
  529.                 {folder: msgHdr.folder, msgHdr:msgHdr, messagePaneVisible:true } );
  530.         }
  531.         
  532.         if (gRmFx_Messenger == "PB") {                // PB 
  533.             
  534.             winId.focus();
  535.             winId.MsgOpenNewTabForFolder(folderUri, msgHdr.messageKey /*key*/, false /*aBackground*/)
  536.         }
  537.  
  538.  
  539.         if (gRmFx_Messenger == "SM2") {
  540.  
  541.             var aTabShowFolderPane  = 1 << 0;
  542.             var aTabShowMessagePane = 1 << 1;
  543.             var aTabShowThreadPane  = 1 << 2;
  544.  
  545.             var aTabModeFolder = aTabShowMessagePane;
  546.                         
  547.             if (!winId) {
  548.                 winId = window.openDialog("chrome://messenger/content/", "",
  549.                     "all,dialog=no");
  550.                 
  551.                 winId = windowManager.getMostRecentWindow("mail:3pane");
  552.             }
  553.             
  554.             winId.focus();
  555.             winId.document.getElementById('tabmail').openTab("3pane",
  556.                 aTabModeFolder, folderUri, msgHdr);    
  557.         }
  558.  
  559.         // select message in the mail index 
  560.         if ((gRmFx_Messenger == "TB2")) {            //TB2
  561.             // --- if folderUri has '/Template' or '/Drafts' it will not open the message
  562.             var xShow = ((folderUri.indexOf("/Templates") == -1) && (folderUri.indexOf("/Drafts") == -1)) ;
  563.  
  564.             // open the message in a new window 
  565.             if ((msgOpen) && (xShow)){
  566.                 var folder = reminderFox_GetMsgFolderFromUri(folderUri);
  567.                 var messageUri = folder.getUriForMsg(msgHdr);
  568.                          
  569.                 window.openDialog("chrome://messenger/content/messageWindow.xul", "_blank",
  570.                                   "all,chrome,dialog=no,status,toolbar", messageUri, folderUri, null);
  571.             }
  572.                         
  573.                try { 
  574.                 var tree = {};
  575.                 var msgDB = {};
  576.                 var length = {};
  577.                 var wintype = {};
  578.                 var msgDBView = {};
  579.                 var indicesArray = {};
  580.                 reminderFox_msgWindow = reminderFox_getMsgWindow();
  581.                 
  582.                 if (document.firstChild.id == "messengerWindow") {
  583.                     wintype = window.document.firstChild.getAttribute("windowtype");
  584.                     reminderFox_msgWindow.SetDOMWindow(window);
  585.     
  586.                     folder = reminderFox_GetMsgFolderFromUri(folderUri);
  587.                     msgDB = folder.getMsgDatabase(reminderFox_msgWindow);
  588.                     msgDB.MarkHdrRead(msgHdr, false, null);
  589.                     reminderFox_msgWindow.SelectFolder(folderUri);
  590.     
  591.                     msgDBView = window.gDBView;
  592.                     if (wintype != "mail:messageWindow") tree = window.GetThreadTree();
  593.                 } else {                      
  594.                     wintype = window.opener.document.firstChild.getAttribute("windowtype");
  595.                     reminderFox_msgWindow.SetDOMWindow(window.opener);
  596.     
  597.                     folder = reminderFox_GetMsgFolderFromUri(folderUri);
  598.                     msgDB = folder.getMsgDatabase(reminderFox_msgWindow);
  599.                     msgDB.MarkHdrRead(msgHdr, false, null);
  600.                     
  601.                     reminderFox_msgWindow.SelectFolder(folderUri);
  602.     
  603.                     msgDBView = window.opener.gDBView;
  604.                     if (wintype != "mail:messageWindow") tree = window.opener.GetThreadTree();
  605.                 }
  606.  
  607.                 if (wintype != "mail:messageWindow") tree.view.selection.clearSelection();
  608.                 msgDBView.selectMsgByKey(msgHdr.messageKey);
  609.                 msgDBView.loadMessageByMsgKey(msgHdr.messageKey);
  610.                 msgDB.MarkHdrRead(msgHdr, true, null);
  611.                 msgDBView.getIndicesForSelection(indicesArray,length);
  612.                 if (wintype != "mail:messageWindow") tree.treeBoxObject
  613.                                                          .ensureRowIsVisible(indicesArray.value[0]);
  614.             } catch( e ) { }
  615.         }
  616.     }
  617.  
  618.  
  619.     if ((gRmFx_Messenger == "SM2") && (msgHdr == null)) {
  620.         var windowManager = Components.classes['@mozilla.org/appshell/window-mediator;1']
  621.                    .getService(Components.interfaces.nsIWindowMediator);
  622.  
  623.         window.openDialog("chrome://messenger/content/", "",
  624.             "all,dialog=no");
  625.         windowManager.getMostRecentWindow("mail:3pane");
  626.  
  627.     //    winId.focus();
  628.     //    winId.document.getElementById('tabmail').openTab("3pane",
  629.     //        aTabModeFolder, folderUri, msgHdr);    
  630.  
  631. }
  632.  
  633.     
  634.     // extract the tag keys from the msgHdr    
  635.     if (msgHdr != null && labelTag != null ) {     
  636.         rmFx_msgTAGing("Reminderfox", opTag, "#993399" );
  637.         
  638.         // delete all iCal-xxxx tags eg: PUBLISH, REQUEST, REPLY, CANCEL, ICS        
  639.            var msgKeyArray = msgHdr.getStringProperty("keywords").split(" ");
  640.        
  641.            if ((opTag == false) && (msgKeyArray.length > 0))  {
  642.                for (var n= 0; n< msgKeyArray.length; n++  ) {
  643.               
  644.                    if (msgKeyArray[n].indexOf("ical") == 0) {
  645.                     try {
  646.                         ToggleMessageTag(msgKeyArray[n], false /*tagOp*/, "", false)  //4th param for PB
  647.                     } catch (ex) {}
  648.                    }
  649.             }
  650.            }
  651.     }
  652.     window.setCursor("auto");
  653.     return msgHdr;
  654. }
  655.  
  656.  
  657.     /**
  658.     * Open a new window with the folder and open message
  659.     *
  660.     * @param uriToOpen - folder uri
  661.     * @param msgID - messageID
  662.     */
  663.     function rmFx_MsgOpenNewWindowForFolder(uriToOpen, msgID) {
  664.     
  665.       if (uriToOpen)
  666.         window.openDialog("chrome://messenger/content/", "_blank", 
  667.                 "chrome,all,dialog=no", uriToOpen, msgID);
  668.     }
  669.  
  670.  
  671.   /**
  672.     * Search for messageid in local folders
  673.     */
  674. function reminderFox_SearchMessageLocally(messageId) {
  675.     var msgHdr = null;
  676.     var folder = null;
  677.     for(var x = 0; x < reminderFox_accountURIs.length && !msgHdr; x++) {  
  678.         folder = reminderFox_GetMsgFolderFromUri(reminderFox_accountURIs[x]).rootFolder;
  679.         msgHdr = reminderFox_SearchInSubFolder(folder, messageId);  
  680.     }
  681.     return msgHdr;
  682. }
  683.  
  684.  
  685.   /**
  686.     * Searchs in subfolder 
  687.     */
  688. function reminderFox_SearchInSubFolder(sFolder, messageId) {
  689.  
  690.         if ((gRmFx_Messenger == "TB3") || (gRmFx_Messenger == "SM2")) {
  691.         // http://mxr.mozilla.org/comm-central/source/mailnews/base/resources/content/folderWidgets.xml#496
  692.         // var msgFolder = folder.QueryInterface(Components.interfaces.nsIMsgFolder);
  693.         
  694.         var subfolder = null;
  695.         var msgHdr = null;
  696.         var msgDB = null;
  697.         var currentFolderURI = "";
  698.     
  699.         var done = false;
  700.                                                 
  701.         if (sFolder.hasSubFolders) {
  702.     
  703.             var subfolders = sFolder.subFolders;
  704.             while (subfolders.hasMoreElements()) {            
  705.                 var subfolder = subfolders.getNext().QueryInterface(Components.interfaces.nsIMsgFolder);
  706.             //    if (currentFolderURI.substring(1,7) != "news://") {  
  707.                     msgHdr = reminderFox_SearchInSubFolder(subfolder, messageId);
  708.             //    }                
  709.                 if (!msgHdr) {
  710.                     try {    
  711.                         var msgDB = subfolder.msgDatabase;
  712.                     } catch (ex) {}
  713.  
  714.                     if ( msgDB != null ) msgHdr = msgDB.getMsgHdrForMessageID(messageId);
  715.                 }
  716.                 if (msgHdr) return msgHdr;     
  717.                 try {
  718.                     subfolders.next();
  719.                 } catch(e) {
  720.                     done = true;
  721.                 }
  722.             } //while
  723.         } //if (sFolder.hasSubFolders)
  724.         return null;
  725.         
  726.     } else {
  727.         
  728.         if (sFolder.hasSubFolders) {
  729.             var subfolders = sFolder.GetSubFolders();
  730.             var subfolder = null;
  731.             var msgHdr = null;
  732.             var msgDB = null;
  733.             var currentFolderURI = "";
  734.             var done = false;
  735.       
  736.             while(!done) {
  737.                 currentFolderURI = subfolders.currentItem()
  738.                                .QueryInterface(Components.interfaces.nsIRDFResource).Value;
  739.                 subfolder = reminderFox_GetMsgFolderFromUri(currentFolderURI);
  740.     
  741.                 if (currentFolderURI.substring(1,7) != "news://") {  
  742.                             msgHdr = reminderFox_SearchInSubFolder(subfolder, messageId);
  743.                 }
  744.                 if (!msgHdr) {
  745.        
  746.                     try {
  747.                         reminderFox_msgWindow = reminderFox_getMsgWindow();
  748.                         msgDB = subfolder.getMsgDatabase(reminderFox_msgWindow);
  749.                     } catch (ex) {
  750.     
  751.                     // subfolder.updateFolder(reminderFox_msgWindow); // TM: this call was causing a hang in some instances
  752.                     // try {
  753.                     // // msgDB = subfolder.getMsgDatabase(reminderFox_msgWindow);
  754.                     // } catch (ex) {
  755.                     // }
  756.                     }
  757.                     if ( msgDB != null ) {
  758.                         msgHdr = msgDB.getMsgHdrForMessageID(messageId);
  759.                     }
  760.                 }
  761.                 if (msgHdr) return msgHdr;
  762.      
  763.                 try {
  764.                     subfolders.next();
  765.                 } catch(e) {
  766.                     done = true;
  767.                 }
  768.             }
  769.         }  // TB2.   if (sFolder.hasSubFolders)
  770.         return null;                
  771.         // } 
  772.     }
  773. }
  774.  
  775.  
  776.     /**
  777.      * Searchs all availible newsserver
  778.      */
  779. function reminderFox_AddNewsServers() {
  780.     if (reminderFox_prefRead == false) {
  781.         var accounts = reminderFox_pmpReadPref("mail.accountmanager.accounts",reminderFox_pmpS);
  782.         if (accounts) {
  783.             var accountsArray = accounts.split(",");
  784.             
  785.             for (var x = 0; x < accountsArray.length; x++) {
  786.                 reminderFox_AddNewsServerMenuItem(accountsArray[x]);
  787.             }
  788.             reminderFox_accountURIs.sort(reminderFox_sortAccountUris);
  789.         }
  790.  
  791.         reminderFox_prefRead = true;
  792.     }
  793. }
  794.  
  795.  
  796.    /**
  797.     * Sortfunction for reminderFox_accountURIs Array Local Folder to the rear
  798.     *
  799.     * @param a and b
  800.     * @return  1:    ;    -1:
  801.     */
  802. function reminderFox_sortAccountUris(a, b) {
  803.  
  804.     if (a.search(/Local%20Folders/) != -1) {
  805.         return 1;
  806.     } else if (b.search(/Local%20Folders/) != -1) {
  807.         return -1;
  808.     } else if (a < b) {
  809.         return -1;
  810.     } else if (a > b) {
  811.         return 1;
  812.     } else {
  813.         return 0;
  814.     }
  815. }
  816.  
  817.  
  818.     /** 
  819.      * Adds newsserver to the context menu
  820.      *
  821.      */
  822. function reminderFox_AddNewsServerMenuItem(account) {
  823.     var server    = reminderFox_pmpReadPref("mail.account." + account + ".server",reminderFox_pmpS);
  824.     var servertyp = reminderFox_pmpReadPref("mail.server."  + server +  ".type",reminderFox_pmpS);
  825.     var hostname  = reminderFox_pmpReadPref("mail.server."  + server +  ".hostname",reminderFox_pmpS);
  826.     var username  = reminderFox_pmpReadPref("mail.server."  + server +  ".userName",reminderFox_pmpS);
  827.  
  828.     var accountURI = "";
  829.     
  830.     if (servertyp == "nntp") {
  831.         var servername = reminderFox_pmpReadPref("mail.server." + server + ".name",reminderFox_pmpS);
  832.         var serverport = reminderFox_pmpReadPref("mail.server." + server + ".port", reminderFox_pmpN);
  833.         // var newsservermenuitem;
  834.  
  835.         if (servername == null) servername = hostname;
  836.         if (serverport == null) serverport = 119;
  837.  
  838. // newsservermenuitem = document.createElement("menuitem");
  839. // newsservermenuitem.setAttribute("label", servername);
  840. // newsservermenuitem.setAttribute("value",server);
  841. // newsservermenuitem.setAttribute("oncommand","reminderFox_MessageIdFinder('" +
  842. // hostname + "', '" + String(serverport) + "','');");
  843.  
  844.         accountURI = "news://" + escape(hostname);
  845.     } else if (servertyp == "imap") {
  846.         accountURI = "imap://" + escape(username) + "@" + escape(hostname);
  847.     } else {
  848.         accountURI = "mailbox://" + escape(username) + "@" + escape(hostname);
  849.     }
  850.  
  851.     if (hostname != null) reminderFox_accountURIs.push(accountURI);
  852. }
  853.  
  854.  
  855.  
  856.     /**
  857.      * Reads the value of pmpName out of the mozilla preferences
  858.      * 
  859.      * @param    pmpName
  860.      * @param    pmpType    Bool,Integer or Char 
  861.      *
  862.      * @return    pmpValue
  863.      */
  864. function reminderFox_pmpReadPref(pmpName, pmpType) {
  865.     var nsIPrefBranch = Components.interfaces.nsIPrefBranch;
  866.     var pref = Components.classes["@mozilla.org/preferences-service;1"]
  867.                          .getService(nsIPrefBranch);
  868.     var pmpValue = null;
  869.     
  870.     if (pref.prefHasUserValue(pmpName)) {
  871.         switch (pmpType) {
  872.             case reminderFox_pmpB:
  873.                 pmpValue = pref.getBoolPref(pmpName);
  874.                 break;
  875.             case reminderFox_pmpN:
  876.                 pmpValue = pref.getIntPref(pmpName);            
  877.                 break;
  878.             case reminderFox_pmpS:
  879.                 pmpValue = pref.getCharPref(pmpName);
  880.                 break;
  881.             default:
  882.                 break;
  883.         }
  884.     }
  885.     
  886.     return pmpValue;
  887. }
  888.  
  889.  
  890.     /**
  891.       * Get msgfolder from Uri
  892.       * 
  893.       * @param    uri
  894.       * @return    null or msgfolder
  895.       */
  896. function reminderFox_GetMsgFolderFromUri(uri) {
  897.     var msgfolder = null;
  898.     
  899.     try {
  900.         var RDF = Components.classes["@mozilla.org/rdf/rdf-service;1"]
  901.                             .getService(Components.interfaces.nsIRDFService);
  902.         var resource = RDF.GetResource(uri);
  903.         
  904.         if (resource instanceof Components.interfaces.nsIMsgFolder &&
  905.            (resource.parent || resource.isServer))
  906.            msgfolder = resource;
  907.            
  908.     } catch (ex) {}
  909.  
  910.     return msgfolder;
  911. }
  912.  
  913.  
  914.  
  915.     /**
  916.       * write the messageId to the associated reminder
  917.       * 
  918.       * @param srcUri     - folder address
  919.       * @param offset    - pointer to the begin of the msg
  920.       */
  921. function rmFx_checkMsgAndUpdateReminder (srcUri, offset) {
  922.  
  923.     var msgUri = reminderFox_GetMsgFolderFromUri(srcUri).baseMessageURI + "#" + offset;
  924.  
  925.     var messenger = Components.classes["@mozilla.org/messenger;1"].createInstance()
  926.                 .QueryInterface(Components.interfaces.nsIMessenger);
  927.     var referencedReminders = rmFxGetRmRef(messenger.messageServiceFromURI(msgUri)
  928.             .messageURIToMsgHdr(msgUri));
  929.     // the 'referencedReminders' comes back with 'messageID' set !!
  930.  
  931.     var msg = "";    
  932.     if (referencedReminders.length > 0) {            
  933.         msg = ("Referenced Reminders: " + referencedReminders.length + "\r\n"
  934.              + referencedReminders[0].summary + "\r\n"
  935.              + "msgId: " + referencedReminders[0].messageID 
  936.              + "  msgRef: " + referencedReminders[0].id + "\r\n" 
  937.              + msgUri + "\r\n");
  938.              
  939.     // now update the ".id" Reminder with the ".messageID"
  940.         var activeReminders = reminderFox_getReminderEvents();    
  941.  
  942.         for ( var i = 0; i < activeReminders.length; i++ ) {
  943.             if (activeReminders[i].id == referencedReminders[0].id ) {
  944.     
  945.             reminderFox_logMessageLevel ("found: " + activeReminders[i].summary
  946.                     + "\r\n pos: " + i,  REMINDER_FOX_LOG_LEVEL_FINE);
  947.  
  948.             reminderFox_removeElement(activeReminders, i);
  949.             reminderFox_insertIntoArray(activeReminders, referencedReminders[0], i);
  950.             reminderFox_writeOutRemindersAndTodos(false);   // isExport
  951.             }
  952.         }
  953.     }
  954.     return msg;
  955. }
  956. ////////////////// end of 'MessageID' //////////////////////////////////////////
  957.  
  958.  
  959.  
  960. //  --- rmFx_folderListener  ----------------------------------------------- ---
  961. /**
  962.  *  folder listener used with    SEND++  
  963.  */  
  964.     var rmFx_FolderListener = {
  965.         OnItemEvent: function(folder, event) {
  966.         //logMsg ("rmFx_Folder Listener " + event.toString());
  967.         },
  968.         OnItemAdded: function(parentItem, item) {
  969.         // logMsg ("Folder Listener OnItemAdded:" + parentItem.Value + "  " + item.messageKey);
  970.         },
  971.         OnItemIntPropertyChanged: function(item, property, oldValue, newValue) {
  972.  
  973.  
  974.     var    msg = "gwTEST:  FolderListener: OnItemIntPropertyChanged: " + item.name                 /*      //gWTEST FolderListener */
  975.                 + "\n" + property.toString() + "  old:" + oldValue + "  new:" + newValue;
  976.     // rmFxUtil.dump2Console (msg);
  977.             
  978.             //Send Alarm        with: GenericSendMessage(nsIMsgCompDeliverMode.Later);
  979.             if ((item.Value == "mailbox://nobody@Local%20Folders/Unsent%20Messages") 
  980.                     && (property.toString() == "TotalMessages")) {
  981.                 reminderFox_logMessageLevel  ("UNSENT Folder " + property.toString() + ": " + oldValue + " " + newValue, 
  982.                     REMINDER_FOX_LOG_LEVEL_FINE);
  983.             }
  984.             
  985.             // SEND++     with: GenericSendMessage(nsIMsgCompDeliverMode.Now);
  986.             if ((item.Value == rmFx_FCC) 
  987.                     && (property.toString() == "FolderSize")) {
  988.                 var msg = "SEND Folder " + property.toString() + ": " + oldValue + " " + newValue;
  989.                 if ( oldValue != newValue) {
  990.                     // reset the 'send folder' and Listener to process only once
  991.                     rmFx_FCC = "";   
  992.                     rmFx_setFolderListener("remove");
  993.  
  994.                     var msg = rmFx_checkMsgAndUpdateReminder (item.Value, oldValue);
  995.                     if (msg == "") {
  996.                         msg = "SEND Folder " + property.toString() + ": " + oldValue + " " + newValue;                        
  997.                     }
  998.                     reminderFox_logMessageLevel (msg, REMINDER_FOX_LOG_LEVEL_FINE);
  999.                 }
  1000.             }
  1001.         }
  1002.     }
  1003.     
  1004.  
  1005. function rmFx_setFolderListener(mode) {
  1006.     const mailSessionContractID = "@mozilla.org/messenger/services/session;1";
  1007.     const nsIMsgMailSession = Components.interfaces.nsIMsgMailSession;
  1008.     var mailSession = Components.classes[mailSessionContractID].getService(nsIMsgMailSession);
  1009.     var nsIFolderListener = Components.interfaces.nsIFolderListener;
  1010.  
  1011.     if (mode == "add") {
  1012.         mailSession.AddFolderListener(rmFx_FolderListener, nsIFolderListener.intPropertyChanged);
  1013.     }
  1014.     if (mode == "remove") {
  1015.         mailSession.RemoveFolderListener(rmFx_FolderListener);
  1016.     }
  1017. }
  1018.  
  1019.  
  1020. /**
  1021.  * ----- rmFx_copyListener ----------------------------------------------------- 
  1022.  */
  1023.  
  1024. var rmFx_copyServiceListener =  { 
  1025.         sfileNP: null, 
  1026.         QueryInterface: function(iid) {
  1027.             if (iid.equals(Components.interfaces.nsIMsgCopyServiceListener) ||
  1028.                             iid.equals(Components.interfaces.nsISupports)) {
  1029.                     return this;
  1030.             }
  1031.             throw Components.results.NS_NOINTERFACE;
  1032.             return 0;
  1033.         },
  1034.         OnProgress: function (progress, progressMax) {
  1035.         },
  1036.         OnStartCopy: function () {
  1037.             // alert ("START  Copy from SEND ALARM")
  1038.         },
  1039.         OnStopCopy: function ( status ) {
  1040.             // alert ("STOP   Copy from SEND ALARM")
  1041.         },
  1042.         SetMessageKey: function (key ) {
  1043.             // alert ("SetMessageKey: " + key )
  1044.         }            
  1045. }
  1046.  
  1047. //////////////  rmFx_sendAlarmMail() ///////////////////////////////////////////
  1048.      /**  
  1049.       * rmFx_sendAlarmMail()
  1050.       * 
  1051. <br> *     EXAMPLE   TEST  EXAMPLE   TEST  EXAMPLE   TEST  EXAMPLE   TEST  EXAMPLE
  1052. <br> * called from a test entry in addreminder-dialog.xul
  1053. <br> *  
  1054. <br> * This function sends a message from the "default" TB mail account.
  1055.       * The passed parameters are used to build a message
  1056.       * which is temporarily written as a file and using
  1057.       * '.sendMessageFile' to send the message without using a 'compose' dialog.
  1058. <br> * 
  1059. <br> * IMPORTANT:
  1060.       *     If this 'alarm' has to be send using the '-reminderFox' commad handler
  1061.       *     as an error / security check the file requires to contain
  1062.       *     'UID:reminder.id' the refID of the reminderfox event in question
  1063.       */
  1064.       
  1065. function rmFx_sendAlarmMail() {    
  1066.     rmFxCore.statusSet ("Sending [Alarm] message!");         //gW_Statusbar
  1067.  
  1068.     var currentReminder = getReminderForSelectedItem(); 
  1069.     
  1070.     var subject = "[ALARM] " + (currentReminder.summary);
  1071.     
  1072.     var toAddresses = "testFox <testFox@xyz.ab>";
  1073.     var fromAddress = "testFox <testFox@xyz.ab>";
  1074.  
  1075.     var body =    "\n\nThis is a ReminderFox 'Alarm' test."
  1076.                 +      "\nSimulating an MAIL triggered from rising an alarm event.\n\n" ;
  1077.     
  1078.  
  1079.     // add to 'body' some specific items for this 'event'        // $$$locale  rmFx_sendAlarmMail NOT USED
  1080.  
  1081.     if (!!currentReminder.categories){
  1082.             body += "*Categories* " + currentReminder.categories  + "\n";
  1083.     }
  1084.     if (!!currentReminder.location){
  1085.             body += "*Location* " + currentReminder.location  + "\n";
  1086.     }
  1087.     if (!!currentReminder.url){
  1088.             body += "*URL* " + currentReminder.url  + "\n";
  1089.     }
  1090.     if (!!currentReminder.notes) {
  1091.             body += "*Notes* ___________________________________\n"
  1092.             + ">" + currentReminder.notes.replace(new RegExp(/\n/g),"\n>");
  1093.     }
  1094.  
  1095.     var refID = currentReminder.id;
  1096.     var footer = "UID:" + refID;
  1097.  
  1098.  
  1099.     // create tmpFile
  1100.     var tmpMsgFile =     rmFxMsg.FileCreate(
  1101.                                         subject, 
  1102.                                         fromAddress, 
  1103.                                         toAddresses,
  1104.                                         1,     /* priority higest */
  1105.                                         body, 
  1106.                                         footer,
  1107.                                         refID);
  1108.     
  1109.     rmFxMsg.FileSend (    
  1110.                     subject,
  1111.                     fromAddress,
  1112.                     toAddresses,
  1113.                     1,      /* priority */    
  1114.                     tmpMsgFile, refID);
  1115.                             
  1116.     rmFxCore.statusSet ("[ALARM] has been send!", "");         //gW_Statusbar
  1117. }
  1118.  
  1119.  
  1120.    /**
  1121.      *  Utilities for Messages/Alarms  /////////////////////////////////////////////
  1122. <br> *  rmFxMsg ()
  1123.      *
  1124.      */
  1125. function rmFxMsg () {
  1126.  
  1127.     rmFxMsg.Compose = function (subject, fromAddress,  toAddresses,
  1128.                 priority, body, footer, refID, iCalToEmailFile, methodTyp) {
  1129.     // =========================================================================    
  1130.         if (rmFxMsg.messenger()) {
  1131.             var fromId = rmFxMsg.getIdentity (fromAddress);
  1132.     
  1133.     
  1134.             if (iCalToEmailFile != null) {    
  1135.                 var msgAttachment                 = Components.classes["@mozilla.org/messengercompose/attachment;1"]
  1136.                                                             .createInstance(Components.interfaces.nsIMsgAttachment);
  1137.                 msgAttachment.temporary         = true;
  1138.                 msgAttachment.name                 = iCalToEmailFile.leafName;
  1139.                 msgAttachment.contentType         = "text/calendar;"        
  1140.                 msgAttachment.contentTypeParam    = "method=" + methodTyp + "; charset=UTF-8";
  1141.     //gWTEST Darwin            msgAttachment.url                 = "file://" + iCalToEmailFile.persistentDescriptor;  
  1142.                 msgAttachment.url                 = "file://" + iCalToEmailFile.path;  
  1143.             }
  1144.           
  1145.             // mail header
  1146.            var composeFields = Components.classes["@mozilla.org/messengercompose/composefields;1"]
  1147.                                      .createInstance(Components.interfaces.nsIMsgCompFields);
  1148.             composeFields.useMultipartAlternative = true;
  1149.        
  1150.             composeFields.characterSet = "UTF-8";
  1151.             composeFields.from             = fromId.email;
  1152.             composeFields.replyTo        = fromId.email;
  1153.             
  1154.             toAddresses = (toAddresses == "null") ? "" : toAddresses;
  1155.             composeFields.to                 = toAddresses;                // ???????????
  1156.  
  1157.                 function exHtml(xString){
  1158.                     return xString.replace(new RegExp(/</g),"<").replace(new RegExp(/>/g),">")
  1159.                 }
  1160.             composeFields.subject         = subject;            
  1161.             composeFields.body             = exHtml(body + footer);
  1162.             composeFields.priority        = priority;
  1163.  
  1164.             if (iCalToEmailFile != null) {
  1165.                 composeFields.addAttachment(msgAttachment);
  1166.             }
  1167.             // message compose paramaters
  1168.             var msgComposeParams                    = Components.classes["@mozilla.org/messengercompose/composeparams;1"]
  1169.                                                             .createInstance(Components.interfaces.nsIMsgComposeParams);
  1170.             msgComposeParams.composeFields     = composeFields;
  1171.             msgComposeParams.identity             = fromId;
  1172.             msgComposeParams.format             = Components.interfaces.nsIMsgCompFormat.Default;
  1173.             msgComposeParams.type                 = Components.interfaces.nsIMsgCompType.New;
  1174.             
  1175.             // open a composer window
  1176.             var messengerCompose = Components.classes["@mozilla.org/messengercompose;1"]
  1177.                         .getService().QueryInterface(Components.interfaces.nsIMsgComposeService);
  1178.                         
  1179.             messengerCompose.OpenComposeWindowWithParams(null, msgComposeParams);
  1180.  
  1181.             rmFxCore.statusSet ("Send message by " + fromId.identityName + " pending." , "");         //gW RmFxStatusbar 
  1182.         
  1183.     } else {
  1184.         /** -- NO 'messenger' .. (like FX) ----------------------------------- **/
  1185.         /*     calling TB -reminderFox COMPOSE:{info about what to compose}     */
  1186.  
  1187.         //messageString definition
  1188.         var msgString = "Subject:"  + subject 
  1189.                     + ";\n;From:"      + fromAddress 
  1190.                     + ";\n;To:"        + toAddresses 
  1191.                     + ";\n;Body:"      + body 
  1192.                     + ";\n;Footer:"    + footer 
  1193.                     + ";\n;priority:"  + priority
  1194.                     + ";\n;refID:"     + refID;
  1195.                     
  1196.                     
  1197.         if (iCalToEmailFile != null) {                        
  1198.                 msgString += ";\n;mailFile:"  + iCalToEmailFile.path;
  1199.         }
  1200.         
  1201.         msgString = escape(msgString);
  1202.  
  1203.         var mailApp = rmFx_MessengerApp();
  1204.         if ((mailApp == null) || (mailApp == ""))  {
  1205.             rmFxUtil.PromptAlert("Messenger not found!");  // reminderFox_getBundle().getString("rf.schedule. $$$string "));
  1206.             return;
  1207.         }
  1208.             
  1209.         var args = new Array();   
  1210.         args [0] = "-reminderFox";
  1211.         args [1] = "COMPOSE:" + subject;
  1212.         args [2] = "-msgString"; 
  1213.         args [3] = msgString;         // compose items to be passed
  1214.         
  1215.         try {
  1216.             go4Process.init(mailApp);
  1217.             } catch (ex) {}
  1218.         go4Process.run(false, args, args.length);
  1219.  
  1220.         return;        // FX schedules TB with COMPOSE:subject -msgString msgString
  1221.          }
  1222.     }
  1223.  
  1224.  
  1225.     var deleteSendFileOnCompletion = true;    // this is the tmpFile, not the 'Send' folder copy
  1226.  
  1227.     /**
  1228.      * Send File
  1229.      *
  1230.      * @see
  1231.      *  http://mxr.mozilla.org/comm-central/source/mailnews/compose/public/nsIMsgSend.idl
  1232.      *  http://mxr.mozilla.org/comm-central/source/mailnews/compose/public/nsIMsgCompFields.idl
  1233.      *
  1234.      * @param subject       the 'subject' the mail comes with    
  1235.      * @param fromAddress   the 'FROM' address sending the msg
  1236.      * @param toAddresses   the 'TO' addresses to receive the msg (csv)
  1237.      * @param body          any message 'body' to be send
  1238.      * @param tmpFile       file object containing the message
  1239.      */
  1240.     rmFxMsg.FileSend = function ( subject, fromAddress, toAddresses, 
  1241.                                                 priority, mailFile, refID) {
  1242.     // =========================================================================    
  1243.         if ( rmFxMsg.messenger()) {        //try    // 'in 'messenger' ??                
  1244.             // need different code for TB2 and TB3/SM2 !!!
  1245.             if("@mozilla.org/filespec;1" in Components.classes) {
  1246.                 // this TB2 code
  1247.                 var mailFileURL = rmFxUtil.getIOService().newFileURI(mailFile).spec;
  1248.                 mailFile = Components.classes["@mozilla.org/filespec;1"]
  1249.                                    .createInstance(Components.interfaces.nsIFileSpec);
  1250.                 mailFile.URLString = mailFileURL;
  1251.             } 
  1252.         
  1253.             var fromId = rmFxMsg.getIdentity (fromAddress);
  1254.         
  1255.             var composeFields = Components.classes["@mozilla.org/messengercompose/composefields;1"]
  1256.                                          .createInstance(Components.interfaces.nsIMsgCompFields);
  1257.             composeFields.characterSet = "UTF-8";
  1258.             composeFields.to             = toAddresses;
  1259.             composeFields.from             = fromId.identityName;
  1260.             composeFields.replyTo        = fromId.identityName;
  1261.             
  1262.             composeFields.priority        = rmFxMsg.setPriorityString (priority);
  1263.     
  1264.             
  1265.             var messengerSend = Components.classes["@mozilla.org/messengercompose/send;1"]
  1266.                                    .createInstance(Components.interfaces.nsIMsgSend);
  1267.             messengerSend.sendMessageFile(
  1268.                        fromId,              /* nsIMsgIdentity */
  1269.                     fromId.key,            /* nsIMsgCompFields */
  1270.                     composeFields,        /* nsIMsgCompFields */
  1271.                     mailFile,            /* nsFileSpec */
  1272.                     deleteSendFileOnCompletion,
  1273.                     false,                 /* digest_p */
  1274.                                              /* nsMsgDeliverMode */
  1275.                         rmFxUtil.getIOService().offline 
  1276.                             ?    Components.interfaces.nsIMsgSend.nsMsgQueueForLater    /* = 1 */
  1277.                             :    Components.interfaces.nsIMsgSend.nsMsgDeliverNow,    /* = 0 */    
  1278.                     null,          /* nsIMsgDBHdr msgToReplace */
  1279.                     null,          /* nsIMsgSendListener aListener */
  1280.                     null,          /* nsIMsgStatusFeedback aStatusFeedback */
  1281.                     "");            /* password */
  1282.     
  1283.         } else { // if the above fails .. in 'NON messenger'
  1284.  
  1285.             rmFxMsg.sendwUID (refID, mailFile.path);
  1286.         }
  1287.     } 
  1288.     
  1289.     /**
  1290.      * File Creation for message
  1291.      * 
  1292.      *  FX:  encodes the whole 'content' string with .encodeUTF8
  1293.      *  TB:  NO encodes the whole 'content'
  1294.      */
  1295.     rmFxMsg.FileCreate = function (subject, fromAddress, toAddresses, priority, 
  1296.                                         body, footer, 
  1297.                                         refID, iCalString, methodTyp) {
  1298.     //===================================================================== 
  1299.         var thisdate = new Date();
  1300.     
  1301.         // add app info  .. will be added to the 'footer'
  1302.         var osInfo = rmFx_opSystemInfo();
  1303.         var appInfo = Components.classes["@mozilla.org/xre/app-info;1"] 
  1304.             .getService(Components.interfaces.nsIXULAppInfo);
  1305.         var appDetails = "\n  " + appInfo.name + " " + appInfo.version 
  1306.                              + " (" + appInfo.platformBuildID + ") -- " + osInfo;
  1307.  
  1308.         var content =     "MIME-version: 1.0\r\n";
  1309.         content +=        "To: "     + toAddresses + "\r\n";
  1310.         
  1311.         if ( rmFxMsg.messenger()) {
  1312.             var contentS = "Subject: " + rmFxMsg.encodeMimeHeader(subject) + "\r\n";  
  1313.             contentS +=    "From: "     + rmFxMsg.getIdentity (fromAddress).identityName + "\r\n"; 
  1314.         } else {
  1315.             var contentS = "Subject: " + subject + "\r\n";
  1316.             contentS +=    "From: "     + fromAddress + "\r\n";  
  1317.         } 
  1318.         content += contentS;
  1319.         
  1320.         content += "Date :" + rmFxCore.mailDateTime(thisdate, "mailDate") + "\r\n";    
  1321.         content += rmFxMsg.setPriorityString(priority) + "\r\n";
  1322.         content += "Content-class: urn:content-classes:reminderfox\r\n";
  1323.  
  1324.         var newDate = new Date();
  1325.         var msgId = reminderFox_generateUniqueReminderId( newDate );
  1326.         
  1327.         if (refID != "") {
  1328.             content
  1329.             += "Reference-ID: <" + refID + rmFx_ReferenceID + ">\r\n"
  1330.              + "In-Reply-To: <" + refID + rmFx_ReferenceID + ">\r\n";
  1331.              + "Message-Id: <" + msgId + rmFx_ReferenceID + ">\r\n";
  1332.         //gw_messageID/In-Reply-To w send/reply invitation
  1333.         }
  1334.         
  1335.         // if 'iCalString' and 'methodTyp'  send with iCal attachment        
  1336.         if (!!iCalString && !!methodTyp) {
  1337.             content    
  1338.             += ("Content-type: multipart/mixed; boundary=\"anhang_1234567890_0987654321\"\r\n"
  1339.          +      "\r\n\r\n"
  1340.          +      "--anhang_1234567890_0987654321\r\n"
  1341.          +      "Content-type: multipart/alternative;\r\n"
  1342.          +      " boundary=\"anhang_0987654321_1234567890\"\r\n"
  1343.          +      "\r\n\r\n"
  1344.          +      "--anhang_0987654321_1234567890\r\n"
  1345.          +      "Content-type: text/plain; charset=UTF-8\r\n"
  1346.          +      "Content-transfer-encoding: 8BIT\r\n"
  1347.          +      "\r\n"
  1348.          
  1349.          +      body 
  1350.  
  1351.          + "\n-- "  /* footer delimiter line !!! do not delete !  
  1352.                                this notation will cut the following part from plain-text-reply !*/
  1353.          +  "\n" + footer + appDetails  
  1354.          +  "\n  ________________________________________________"
  1355.          +  "\n  http://reminderfox.mozdev.org/\n"
  1356.          
  1357.          +      "\r\n\r\n\r\n"
  1358.          +      "--anhang_0987654321_1234567890\r\n"
  1359.          +      "Content-type: text/calendar; method=" + methodTyp + "; charset=UTF-8\r\n"
  1360.          +      "Content-transfer-encoding: 8BIT\r\n"
  1361.          +      "\r\n"
  1362.          
  1363.          +      iCalString
  1364.          +      "\r\n\r\n"
  1365.          
  1366.          +      "--anhang_0987654321_1234567890--\r\n\r\n"
  1367.  
  1368.          +      "--anhang_1234567890_0987654321\r\n"
  1369.          +      "Content-type: application/ics; name=invite.ics\r\n"
  1370.          +      "Content-transfer-encoding: 8BIT\r\n"
  1371.          +      "Content-disposition: attachment; filename=invite.ics\r\n"
  1372.          +        "\r\n"    /* need an extra line to separate header !! */
  1373.          
  1374.          +      iCalString    
  1375.          +      "\r\n\r\n"
  1376.          
  1377.          +      "--anhang_1234567890_0987654321--\r\n");
  1378.             
  1379.         } else {    // send message with inline text
  1380.         
  1381.             content 
  1382.             += "Content-type: text/plain; charset=UTF-8\r\n" 
  1383.             +    "Content-transfer-encoding: 8bit\r\n\r\n" 
  1384.             +  body
  1385.              
  1386.             +  "\n-- "  /* footer delimiter line !!! do not delete !  
  1387.                                this notation will cut the following part from plain-text-reply !*/
  1388.             +  "\n" + footer + appDetails
  1389.             +  "\n  ________________________________________________"
  1390.             +  "\n  http://reminderfox.mozdev.org/\n";
  1391.         }
  1392.         
  1393.         if ( !rmFxMsg.messenger()) {
  1394.             content = rmFxUtil.encodeUTF8(content);
  1395.         }
  1396.             
  1397.         // ------ write TMP file ---------------
  1398.         return  rmFxUtil.makeMsgFile8 (content, rmFxUtil.buildUIDFile(refID));
  1399.     }
  1400.  
  1401.  
  1402.  
  1403.     rmFxMsg.setPriorityString = function (priority) {
  1404.     // =========================================================================
  1405.         var cPriority = "";
  1406.         switch (priority) {
  1407.         case "1":    cPriority        = "X-Priority: 1 (Highest)";    break;                    
  1408.         case "2":    cPriority        = "X-Priority: 2 (High)"; break;
  1409.         case "3":    cPriority        = "X-Priority: 3 (Normal)"; break;
  1410.         case "4":    cPriority        = "X-Priority: 4 (Low)"; break;
  1411.         case "5":    cPriority        = "X-Priority: 5 (Lowest)"; break;
  1412.         default: cPriority        = "X-Priority: 3 (Normal)"; break;
  1413.         }
  1414.         return cPriority;
  1415.     }
  1416.     
  1417.  
  1418. /////////////////// 'SendFILE' for "NON" messenger   ///////////////////////////
  1419.     /**
  1420.      *    use a specific 'commandLine' Handler ... this is the NON 'messenger' part
  1421.      */
  1422.      rmFxMsg.sendwUID = function (reminderID, msgString) {
  1423.     // =========================================================================    
  1424.         var mailApp = rmFx_MessengerApp();
  1425.         if ((mailApp == null) || (mailApp == ""))  {
  1426.             rmFxUtil.PromptAlert("Messenger not found!");  // reminderFox_getBundle().getString("rf.schedule. $$$string "));
  1427.             return;
  1428.         }
  1429.         var osInfo = rmFx_opSystemInfo();
  1430.  
  1431.         var args = new Array();   
  1432.         args [0] = "-reminderFox";
  1433.         args [1] = "UID:"+ (reminderID);
  1434.         args [2] = "-msgString"; 
  1435.                                 
  1436.         if(osInfo.indexOf("Darwin") != -1) {
  1437.             args [3] = Components.classes["@mozilla.org/file/directory_service;1"]
  1438.                 .getService(Components.interfaces.nsIProperties)
  1439.                 .get("TmpD", Components.interfaces.nsIFile);
  1440.         } else {
  1441.             args [3] = Components.classes["@mozilla.org/file/directory_service;1"]
  1442.                 .getService(Components.interfaces.nsIProperties)
  1443.                 .get("Progs", Components.interfaces.nsIFile).path.substring(3);
  1444.         }
  1445.                 
  1446.         var cDate = new Date();
  1447.         var msgLog = " ** Send with **   UID:" + reminderID + " at: " + cDate;
  1448.         rmFxCore.statusSet(msgLog);
  1449.         
  1450.         try {
  1451.             go4Process.init(mailApp);
  1452.             } catch (ex) {}
  1453.         go4Process.run(false, args, args.length);
  1454.         
  1455.         return;        // scheduled TB with UID:reminderID -msgString mailFile.path
  1456.     }   
  1457.     
  1458.     /**
  1459.      *     called from 'commandLine' Handler ... this is the 'messenger' part
  1460.      */
  1461.     rmFxMsg.sendwUIDgo = function () {
  1462.     // ========================================================================
  1463.         if (!(rmFx_cmdID.indexOf('UID:') > -1)) { // check transfered code and validity
  1464.             return;    // not valid!! Terminate
  1465.         }
  1466.         window.close();
  1467.  
  1468.         var icsFile = rmFxUtil.buildUIDFile(rmFx_cmdID.substring(4))
  1469.         
  1470. //    rmFxUtil.dump2Console ("gWTEST: sendwUIDgo icsFile >>" + icsFile + "<<");            //gWTEST Darwin    sendwUIDgo
  1471.  
  1472.         
  1473.         var icsData = rmFxUtil.readInFileContents(icsFile)
  1474.                                .replace(/(\r\n)/g,"\n");
  1475.  
  1476.         if (icsData.indexOf (rmFx_cmdID+"\n") == -1) {
  1477.             var msgError = "*** Transfered ICS data has error: -1 ***" 
  1478.                     + "\n   data >>" +  rmFx_cmdID + "<<"; 
  1479.             rmFxUtil.dump2Console (msgError);
  1480.             return;    // not valid!! Terminate
  1481.         }
  1482.     
  1483.         
  1484.     /* ----- check if file valid -----   +++2Todo      +++2Todo      +++2Todo      +++2Todo
  1485.         var osInfo = rmFx_opSystemInfo();        <<-- with Darwin fails !!
  1486.         if(osInfo.indexOf("Darwin") == -1) { 
  1487.  
  1488.             if (rmFx_cmdString !=  Components.classes["@mozilla.org/file/directory_service;1"]
  1489.                         .getService(Components.interfaces.nsIProperties)
  1490.                         .get("Progs", Components.interfaces.nsIFile).path.substring(3)) {
  1491.                 var msgError = "*** Transfered ICS data has error: -2 ***";
  1492.      
  1493.                 rmFxUtil.dump2Console (msgError);
  1494.                 return;    // not valid!! Terminate
  1495.             }
  1496.         } else {
  1497.             if (rmFx_cmdString !=  Components.classes["@mozilla.org/file/directory_service;1"]
  1498.                         .getService(Components.interfaces.nsIProperties)
  1499.                         .get("TmpD", Components.interfaces.nsIFile).path.substring(3)) {
  1500.                 var msgError = "*** Transfered ICS data has error: -2 (Darwin) ***";
  1501.      
  1502.                 rmFxUtil.dump2Console (msgError);
  1503.                 return;    // not valid!! Terminate
  1504.             }
  1505.         }
  1506.     -------------- */
  1507.  
  1508.        var msgString = rmFx_cmdString.split(";\n;");
  1509.     
  1510.         // retrieve msg infos from 'ics file'  
  1511.        var msgLines = icsData.split("\n");
  1512.                                
  1513.        var toAddresses    = msgLines[1].substring(4);
  1514.        var subject         = msgLines[2].substring(9);
  1515.        var fromAddress    = msgLines[3].substring(6);
  1516.        var priority     = msgLines[5].substring(12,13);
  1517.  
  1518.         rmFxUtil.makeMsgFile (msgLines.join("\n"), icsFile);     
  1519.      
  1520.         var mailFile = Components.classes["@mozilla.org/file/local;1"]
  1521.                     .createInstance(Components.interfaces.nsILocalFile);                              
  1522.         mailFile.initWithPath(icsFile);
  1523.        
  1524.         rmFxMsg.FileSend(
  1525.                     subject,
  1526.                     fromAddress, 
  1527.                     toAddresses, 
  1528.                     priority, 
  1529.                     mailFile);    
  1530.     }
  1531.  
  1532. //////////////////// 'COMPOSE' for NON 'messenger'   ///////////////////////////
  1533.  
  1534.     /**
  1535.      *   use a specific 'commandLine' Handler ... this is the NON 'messenger' part
  1536.      * 
  1537.      */
  1538.     rmFxMsg.composeMSG = function (reminderID, msgString) {
  1539.     // =========================================================================
  1540.     var mailApp = rmFx_MessengerApp();
  1541.     if ((mailApp == null) || (mailApp == ""))  {
  1542.         rmFxUtil.PromptAlert("Messenger not found!");  // reminderFox_getBundle().getString("rf.schedule. $$$string "));
  1543.            return;
  1544.         }
  1545.         
  1546.     var args = new Array();   
  1547.     args [0] = "-reminderFox";
  1548.     args [1] = "COMPOSE:"+ (reminderID);
  1549.     args [2] = "-msgString"; 
  1550.     args [3] = msgString;
  1551.         
  1552.     try {
  1553.         go4Process.init(mailApp);
  1554.     } catch (ex) {}
  1555.     go4Process.run(false, args, args.length);
  1556.  
  1557.         return;        // FX schedules TB with COMPOSE:reminderID -msgString msgString
  1558.     }   
  1559.     
  1560.     /**
  1561.      *  called from 'commandLine' Handler ... this is the 'messenger' part
  1562.      */
  1563.         rmFxMsg.composeMSGgo = function () {
  1564.         // =========================================================================
  1565.             if (!(rmFx_cmdID.indexOf('COMPOSE:') > -1)) { // check transfered code and validity
  1566.         return;    // not valid!! Terminate
  1567.             }
  1568.             window.close();
  1569.  
  1570.             // retrieve msg infos from passed window parameters
  1571.             var msgString = unescape(rmFx_cmdString).split(";\n;");
  1572.         
  1573.             var subject       = msgString[0].substring(8);
  1574.             var fromAddress   = msgString[1].substring(5);
  1575.             var toAddresses   = msgString[2].substring(3);
  1576.             var body          = msgString[3].substring(5);
  1577.             var footer        = msgString[4].substring(7);
  1578.             var priority      = msgString[5].substring(9);
  1579.             var refID         = msgString[6].substring(6);
  1580.        
  1581. //            rmFxUtil.dump2Console("gWTEST:  composeMSGgo icsFile string >>" + msgString[7] + "<<");            //gWTEST Darwin
  1582.         
  1583.             if (msgString[7] != null) {
  1584.             var icsFile       = msgString[7].substring(9);
  1585.             var mailFile = Components.classes["@mozilla.org/file/local;1"]
  1586.                         .createInstance(Components.interfaces.nsILocalFile);                              
  1587.             mailFile.initWithPath(icsFile);  
  1588.             } else {
  1589.                 mailFile = null;
  1590.             }
  1591.        
  1592.     // var toAddresses   = "";
  1593.     var methodTyp     = "PUBLISH";
  1594.         
  1595.     rmFxMsg.Compose (subject, fromAddress,  toAddresses,
  1596.         priority, body, footer, refID, mailFile, methodTyp);
  1597.     }
  1598.  
  1599.  
  1600. //////////////////// utilities 'messenger' /////////////////////////////////////
  1601.  
  1602.     rmFxMsg.messenger = function () {
  1603.     // =========================================================================
  1604.         return (Components.classes["@mozilla.org/messenger/account-manager;1"] != null);
  1605.     }
  1606.  
  1607.     rmFxMsg.getAccountMngr = function  () {
  1608.     // =========================================================================
  1609.         return Components.classes["@mozilla.org/messenger/account-manager;1"]
  1610.                 .getService().QueryInterface(Components.interfaces.nsIMsgAccountManager);
  1611.     }
  1612.     
  1613.     rmFxMsg.encodeMimeHeader = function (header) {
  1614.     // =========================================================================
  1615.     // http://www.xulplanet.com/references/xpcomref/ifaces/nsIMimeConverter.html
  1616.        var mimeConverter = Components.classes["@mozilla.org/messenger/mimeconverter;1"]
  1617.                                       .createInstance(Components.interfaces.nsIMimeConverter);
  1618.        return mimeConverter.encodeMimePartIIStr(rmFxUtil.encodeUTF8(header), false, 
  1619.                         "UTF-8", header.indexOf(":") + 2, 72);
  1620.     }
  1621.  
  1622.     /**
  1623.      *   'messenger'       use mail.accountmanager.accounts and identities
  1624.      *   NON 'messenger'   prefs = extensions.reminderFox.mail.sender
  1625.      */
  1626.     rmFxMsg.myMailIDs = function () {
  1627.     // =========================================================================
  1628.     if (rmFxMsg.messenger()) // OK: if we are in 'mail' system (TB, SM)
  1629.  
  1630.         {     // this is tree pass process to eliminate identities for 'nntp'
  1631.             //  sounds complicate ... but didn't found a straight forward process   
  1632.             var as = Components.classes["@mozilla.org/messenger/account-manager;1"]
  1633.                .getService(Components.interfaces.nsIMsgAccountManager).allServers;
  1634.             var servers="";
  1635.             for (var i = 0; i < as.Count(); ++i) {
  1636.                 var nextTyp  = as.GetElementAt(i)
  1637.                     .QueryInterface(Components.interfaces.nsIMsgIncomingServer).type;
  1638.                 if (nextTyp != "nntp") {
  1639.                     var nextKey  = as.GetElementAt(i)
  1640.                         .QueryInterface(Components.interfaces.nsIMsgIncomingServer).key;
  1641.                     servers += nextKey +",";
  1642.                 }
  1643.             }
  1644.  
  1645.             var _prefs = Components.classes["@mozilla.org/preferences-service;1"].
  1646.                     getService(Components.interfaces.nsIPrefBranch);    
  1647.             var accounts = _prefs.getCharPref("mail.accountmanager.accounts");
  1648.     
  1649.            var idstr=""; 
  1650.             if (accounts) {
  1651.                 var accountsArray = accounts.split(",");    
  1652.                 for (var x = 0; x < accountsArray.length; x++) {
  1653.                     var temp1 = _prefs.getCharPref("mail.account." + accountsArray[x] + ".server");
  1654.                     if (servers.indexOf(temp1)> -1) { 
  1655.                     try { idstr += _prefs.getCharPref("mail.account." + accountsArray[x] 
  1656.                             + ".identities") +",";}
  1657.                         catch (ex) {}
  1658.                     }
  1659.                 }
  1660.             }
  1661.  
  1662.             var ids = Components.classes["@mozilla.org/messenger/account-manager;1"].
  1663.                           getService(Components.interfaces.nsIMsgAccountManager).allIdentities;    
  1664.             var mailIds = "";
  1665.             for (var i = 0; i < ids.Count(); ++i) {
  1666.                 var nextId  = ids.GetElementAt(i).
  1667.                                     QueryInterface (Components.interfaces.nsIMsgIdentity);
  1668.                     if (idstr.indexOf(nextId.key)> -1) {             
  1669.                         try { mailIds += nextId.identityName + ",";}
  1670.                             catch (ex) {}
  1671.                     }
  1672.             }
  1673.             // delete last comma
  1674.             mailIds = mailIds.substring(0,mailIds.length-1);
  1675.  
  1676.         } else { // 'NON messenger' .. eg.FX etc ...
  1677.             try {
  1678.                 var mailIds = reminderFox_prefsBranch.getCharPref(REMINDER_FOX_MAIL_SENDER);
  1679.             } catch (ex) {}
  1680.         }
  1681.         return mailIds;
  1682.     }
  1683.  
  1684.     /** 
  1685.      *    checks all non-nntp servers for valid 'fromAddress'
  1686.      *     returns the 'identity'
  1687.      *     If not matching 
  1688.      *         -- not valid mailName --> take first valid identity for that server
  1689.      *         -- at all, take 'defaultAccount.defaultIdentity'
  1690.      * 
  1691.      *     in NON 'messenger' just return the 'fromAddress'
  1692.      */
  1693.     rmFxMsg.getIdentity = function (fromAddress) {
  1694.     // =========================================================================
  1695.         var ids = Components.classes["@mozilla.org/messenger/account-manager;1"].
  1696.                           getService(Components.interfaces.nsIMsgAccountManager).allIdentities;
  1697.         if ((fromAddress != null ) &&  (fromAddress != "" )) {
  1698.             var returnId = null;
  1699.             var xMailAdr ="x";
  1700.             var xId = -1;
  1701.             for (var i = 0; i < ids.Count(); ++i) {
  1702.         
  1703.                 var nextId  = ids.GetElementAt(i).
  1704.                                     QueryInterface (Components.interfaces.nsIMsgIdentity);
  1705.                 if ((fromAddress.indexOf(nextId.email) > -1) && (xMailAdr != nextId.email)){
  1706.                     xMailAdr =nextId.email;
  1707.                     xId = i;
  1708.                 }
  1709.                 if (nextId.identityName == fromAddress) {return nextId;}
  1710.             }
  1711.         }
  1712.     //    return ids.GetElementAt(xId).
  1713.     //                                QueryInterface (Components.interfaces.nsIMsgIdentity);
  1714.     
  1715.             // not found at all, return default
  1716.         return  rmFxMsg.getAccountMngr().defaultAccount.defaultIdentity;
  1717.     }
  1718.      
  1719.      
  1720.     /**
  1721.     * Checks for the messenger version (TB1, TB2, TB3, SM, PB) 
  1722.     * and sets the global parameter 'gRmFx_Messenger'
  1723.     *
  1724.     * @note  this function has to be stored in mail.js for 'remote'
  1725.     * access of 'compose', search with 'UID' and 'msgID'
  1726.     *  
  1727.     * @return   gRmFx_Messenger
  1728.     */
  1729.     rmFxMsg.whichMessenger = function () {
  1730.     // =========================================================================
  1731.  
  1732.         var REMINDERFOX_SEAMONKEY_ID = "{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}";
  1733.         var REMINDERFOX_THUNDERBIRD_ID = "{3550f703-e582-4d05-9a08-453d09bdfdc6}";
  1734.         var REMINDERFOX_POSTBOX_ID = "postbox@postbox-inc.com";
  1735.  
  1736.         if (gRmFx_Messenger != null) return gRmFx_Messenger;
  1737.         
  1738.         var id;
  1739.         if("@mozilla.org/xre/app-info;1" in Components.classes) {
  1740.             // running under Mozilla 1.8 or later
  1741.             id = Components.classes["@mozilla.org/xre/app-info;1"]
  1742.                            .getService(Components.interfaces.nsIXULAppInfo).ID;
  1743.         } else {
  1744.             try {
  1745.                 id = Components.classes["@mozilla.org/preferences-service;1"]
  1746.                              .getService(Components.interfaces.nsIPrefBranch)
  1747.                              .getCharPref("app.id");
  1748.             } catch(e) {}
  1749.         }
  1750.         /* ----------------------
  1751.         Thunderbird 2.x: $[0] = [string] "Thunderbird/2.0.0.22"
  1752.         Shredder: $[0] = [string] "Shredder/3.0b3pre"
  1753.         Postbox: $[0] = [string] "Thunderbird/1.0b13"           
  1754.         ----- */
  1755.             
  1756.         var idName="";
  1757.         var _prefs = Components.classes["@mozilla.org/preferences-service;1"]
  1758.                                         .getService(Components.interfaces.nsIPrefBranch); 
  1759.         switch (id) {
  1760.             case (REMINDERFOX_POSTBOX_ID) :     idName = "PB"; break;
  1761.             case (REMINDERFOX_SEAMONKEY_ID) : {  
  1762.                 var tbVersion = _prefs.getCharPref("general.useragent.extra.seamonkey");
  1763.                 if (tbVersion.search("SeaMonkey/1.") > -1) idName = "SM1";
  1764.                 if (tbVersion.search("SeaMonkey/2.") > -1) idName = "SM2";
  1765.                 break;
  1766.             }    
  1767.             case (REMINDERFOX_THUNDERBIRD_ID) :  {
  1768.                 var tbVersion = _prefs.getCharPref("general.useragent.extra.thunderbird");
  1769.                 if (tbVersion.search("Thunderbird/1.") > -1) idName = "TB1";
  1770.                 if (tbVersion.search("Thunderbird/2.") > -1) idName = "TB2";
  1771.                 if (tbVersion.search("Thunderbird/3.") > -1) idName = "TB3";
  1772.                 if (tbVersion.search("Shredder/3.") > -1)    idName = "SH3";
  1773.                 break;
  1774.             }
  1775.         }
  1776.         
  1777.         gRmFx_AB3 = (idName == "TB3") || (idName == "SM2"); //  || (msgnrType == "PB")); 
  1778.  
  1779.         gRmFx_Messenger = idName;
  1780.         return idName;  
  1781.     }